The statements in this section merely provide background information related to the present disclosure and may not constitute prior art.
Known control systems include embedded systems that have control modules configured to execute embedded software programs to accomplish one or more prescribed functions. The control module and embedded software program can be concurrently designed and developed, often referred to as a codesign process. The control module can include a programmable processing device, including one of an application-specific integrated circuit (ASIC), an electronic circuit, and a central processing unit, e.g., a microprocessor. The programmable processing device includes or is signally and operatively connected to memory and storage devices. Exemplary memory and storage devices include, e.g., read only memory (ROM), programmable read only memory (PROM), random access memory (RAM), and hard drives. The programmable processing device is configured to execute one or more embedded software or firmware programs. The control module may include combinational logic circuit(s), input/output circuit(s) and device(s) that signally and operatively connect to the processor. The control module includes appropriate signal conditioning and buffer circuitry and other suitable components to accomplish the prescribed function.
Embedded software can be developed and specified using a programming language that can be compiled into machine code suitable for storing and execution by the programmable processing device of the control module. A known software analysis method includes program slicing to identify a subset of program statements that may affect computation at a particular point in a program. This program point, which may be defined as a statement or a particular variable used at a statement, is called the slicing criterion. In the simple case of a single entry, single-exit program, a slice is determined by finding all the transitive data flow and control dependences that lead to the slicing criterion. Slicing is useful as a maintenance or reuse tool for activities such as program understanding, debugging, regression testing, and function extraction from existing code. As an interactive tool, a program slicer facilitates understanding of relevant portions of the software by directly transforming the source code into a simplified specification.
A program slice consists of those statements that may affect the values of criterion variables, including whether or not the statement executes. One known slice is computed by iteratively solving data and control flow equations based on a control flow graph representation of a software program.
A control flow graph is a representation of a program suitable for systematic analysis, derived from an imperative language source code specification using standard techniques. A control flow graph includes operations, referred to as nodes, and control and data paths between operations, referred to as edges. A flow graph is an equivalent representation that consists of basic procedures and control paths between the basic procedures. A basic procedure is a sequence of operations that always execute as a group. A control flow graph is a common representation for source code analysis, and standard techniques exist to find control dependence relationships and data flow dependence relationships.
In a control flow graph-based approach, a system dependence graph summarizes control and data dependences of an entire program or portion thereof. A system dependence graph is composed of one or more procedure dependence graphs, where each procedure dependence graph summarizes intra-procedure control and data flow dependences. The procedure dependence graphs, one for each procedure in the program, are connected in the system dependence graph with edges that indicate inter-procedure data and control dependences. A graph-based approach allows a more precise calculation of a slice and includes fewer statements. A threaded control flow graph can be defined such that all parallel threads are explicitly indicated in a single control flow graph, which is then analyzed to find interference dependences, which are data flow dependences between parallel software threads, as well as feasible execution order for the multiple software threads.